/**
 * DRep.java
 *
 * @author Alex Tough (07-41604)
 * @author Carlos Colmenares (06-39380)
 *
 * Interfaz que define el comportamiento remoto de un programa
 * DRep, el cuál es un manejador sencillo de repositorios.
 */
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface DRep extends Remote {
    
    /**
     * Retorna una lista con los nombres y tamaños en
     * bytes de los archivos que se encuentran en el repositorio.
     * @return Lista con el formato "Nombre Tamaño(bytes)" por cada
     *         archivo en el repositorio.
     * @throws RemoteException Si hay algún error con la conexión.
     */
    public String[] ldir() throws RemoteException;
    
    /**
     * Retorna una lista con todos los usuarios conectados a algún
     * DRep que esté a su vez conectado al mismo DMon que el DRep
     * con el que fue invocado el método.
     *
     * @return Una lista con el formato "NombreUsuario HostDRep:PuertoDRep"
     *         por cada usuario conetado al DMon de este DRep.
     * @throws RemoteException En caso de una falla de conexión.
     */
    public String[] tuser() throws RemoteException;
 
    /**
     * Indica el numero de todos los programas drep que están activos en 
     * el sistema.
     *
     * @return El numero de programas drep que estan activos en el sistema.
     *
     * @throws RemoteException En caso de una falla de conexión.
     */
    public int nrep() throws RemoteException;  
 
    /**
     * Sube al repositorio el archivo pasado en la línea de argumentos con
     * el nombre indicado, si este archivo ya existe en el repositorio,
     * es reescrito.
     *
     * @param nombreDeArchivo El nombre con el que se guardará el archivo en
     *        el repositorio.
     * @param archivo Stream de bytes que representa el archivo a subir.
     * @throws RemoteException Si hay una falla en la conexión.
     */
    public void sube(String nombreDeArchivo, byte[] archivo)
        throws RemoteException;

    /**
     * Retorna el stream de bytes correspondiente al archivo que se indique,
     * en caso de que el archivo no esté en el repositorio, se retorna una
     * excepción.
     *
     * @param nombreDeArchivo Nombre del archivo que se desea obtener del
     *        repositorio.
     * @return El archivo en cuestión representado como un arreglo de
     *         bytes.
     * @throws DRepException En caso de que el archivo no exista.
     * @throws RemoteException En caso de una falla de conexión.
     */
    public byte[] baja(String nombreDeArchivo)
        throws DRepException, RemoteException;

    /**
     * Registra a un usuario que se conecta al DRep, lo guarda en la
     * BD del DMon
     * @param nombreDeUsuario El nombre del usuario a registrar
     * @throws RemoteException En caso de una falla de conexión.
     * @throws DMonException En caso de una falla en el DMon
     */
    public void registrarUsuario(String nombreDeUsuario)
        throws RemoteException, DMonException;

    /**
     * Desconecta un usuario del DMon, y lo saca de la BD
     * @param nombreDeUsuario El nombre del usuario a desconectar
     * @throws RemoteException En caso de una falla de conexión.
     * @throws DMonException En caso de un error del DMon
     */
    public void desconectarDCLI(String nombreDeUsuario)
        throws RemoteException, DMonException;
}
